#include "dialoghistograme.h"

DialogHistograme::DialogHistograme(QWidget *parent) :
    QDialog(parent)
{
}

DialogHistograme::DialogHistograme(QWidget *parent, int * phistograme, int pmode) :
    QDialog(parent)
{
    histograme=phistograme;
    mode=pmode;

    histogrameLabel = new QLabel;
    histogrameLabel->setBackgroundRole(QPalette::Base);
    histogrameLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    histogrameLabel->setScaledContents(true);

    creerHistograme();
}

DialogHistograme::~DialogHistograme()
{
}

void DialogHistograme::creerHistograme()
{
    int i,j,k,l,max;
    int largeurAbscisse=3, largeurOrdonnee = 7;
    int tailleAxeAbscisse=3, tailleAxeOrdonnee=3, tailleBandeCouleur=10;
    int margeGauche=5,margeDroite=5,margeHaute=5,margeBasse=5;
    int bordureGauche=tailleAxeOrdonnee+margeGauche,bordureDroite=margeDroite,bordureHaute=margeHaute,bordureBasse=tailleAxeAbscisse+tailleBandeCouleur+margeBasse;
    int largeur=256*largeurAbscisse+bordureGauche+bordureDroite, hauteur=101*largeurOrdonnee+bordureHaute+bordureBasse;
    QRgb qcouleur;
    QColor cwhite = QColor("white"), cblack = QColor("black"), cgray = QColor("darkGray"), cred = QColor("red"), cgreen = QColor("green"), cblue = QColor("blue"), cyellow = QColor("yellow");

    QImage image(largeur,hauteur,QImage::Format_RGB32);

    //mettre l'image en blanc
    for(j=0;j<hauteur;j++)
    {
        for(i=0;i<largeur;i++)
        {
            image.setPixel(i,j,qRgb(cwhite.red(),cwhite.green(),cwhite.blue()));
        }
    }
    //créer les axes en noir
    for(i=margeGauche;i<largeur-margeDroite;i++)
        for(j=margeBasse+tailleBandeCouleur;j<bordureBasse;j++)
            image.setPixel(i,hauteur-j,qRgb(cblack.red(),cblack.green(),cblack.blue()));
    for(j=margeHaute;j<hauteur-margeBasse;j++)
        for(i=margeGauche;i<bordureGauche;i++)
            image.setPixel(i,hauteur-j,qRgb(cblack.red(),cblack.green(),cblack.blue()));
    //créer les graduations
    for(i=1;i<256;i++)
        if(i%50==0)
            for(k=0;k<largeurAbscisse;k++)
                for(j=margeBasse+tailleBandeCouleur;j<bordureBasse;j++)
                    image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-j,qRgb(cwhite.red(),cwhite.green(),cwhite.blue()));
    for(j=1;j<101;j++)
        if(j%25==0)
            for(l=0;l<largeurOrdonnee;l++)
                for(i=margeGauche;i<bordureGauche;i++)
                    image.setPixel(i,hauteur-(j*largeurOrdonnee+l+bordureBasse),qRgb(cwhite.red(),cwhite.green(),cwhite.blue()));
    //créer la bande de couleur
    for(i=0;i<256;i++)
    {
        switch(mode)
        {
            case 0 :
                qcouleur = qRgb(i,i,i);
                break;
            case 1 :
                qcouleur = qRgb(i,0,0);
                break;
            case 2 :
                qcouleur = qRgb(0,i,0);
                break;
            case 3 :
                qcouleur = qRgb(0,0,i);
                break;
            default :
                qcouleur = qRgb(0,0,0);
        }

        for(k=0;k<largeurAbscisse;k++)
            for(j=margeBasse;j<margeBasse+tailleBandeCouleur;j++)
                image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-j,qcouleur);
    }

    //créer le fond pour vérification
    for(i=0;i<256;i++)
        for(j=0;j<101;j++)
            for(k=0;k<largeurAbscisse;k++)
                for(l=0;l<largeurOrdonnee;l++)
                    image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-(j*largeurOrdonnee+l+bordureBasse),qRgb(cyellow.red(),cyellow.green(),cyellow.blue()));

    //placer les valeurs
    switch(mode)
    {
        case 0 :
            qcouleur = qRgb(cgray.red(),cgray.green(),cgray.blue());
            break;
        case 1 :
            qcouleur = qRgb(cred.red(),cred.green(),cred.blue());
            break;
        case 2 :
            qcouleur = qRgb(cgreen.red(),cgreen.green(),cgreen.blue());
            break;
        case 3 :
            qcouleur = qRgb(cblue.red(),cblue.green(),cblue.blue());
            break;
        default :
            qcouleur = qRgb(cwhite.red(),cwhite.green(),cwhite.blue());
    }
    for(i=0;i<256;i++)
    {
        max = pourcentage(histograme[i],largeurOrdonnee,histograme[256]);

        for(j=0;j<max;j++)
            for(k=0;k<largeurAbscisse;k++)
                image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-(j+bordureBasse),qcouleur);
    }



    histogrameLabel->setPixmap(QPixmap::fromImage(image));
    histogrameLabel->show();
    histogrameLabel->adjustSize();

}

int DialogHistograme::pourcentage(int x, int largeurOrdonnee, int nbTotPixel)
{
    float pourcentage=(float)x*100.0/(float)nbTotPixel;
    float arrondi = arrondi1d(pourcentage);
    int pEntiere = floor(arrondi);
    float pDecimale=arrondi-pEntiere;
    int premiereDecimale=pDecimale*10.0;
    int offset = premiereDecimale*largeurOrdonnee/10;
    int r= pEntiere*largeurOrdonnee+offset;

    return r;
}

float DialogHistograme::arrondi1d(float x)
{
    float temp1=x*100.;
    int chiffresSignificatifs = floor(temp1);
    int sansDernierChiffre = chiffresSignificatifs/10;
    int dernierChiffre = chiffresSignificatifs%10;
    if(dernierChiffre>=5)
        sansDernierChiffre++;
    return (float)sansDernierChiffre/10.;
}
